//请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。 
//
// 数值（按顺序）可以分成以下几个部分： 
//
// 
// 若干空格 
// 一个 小数 或者 整数 
// （可选）一个 'e' 或 'E' ，后面跟着一个 整数 
// 若干空格 
// 
//
// 小数（按顺序）可以分成以下几个部分： 
//
// 
// （可选）一个符号字符（'+' 或 '-'） 
// 下述格式之一：
// 
// 至少一位数字，后面跟着一个点 '.' 
// 至少一位数字，后面跟着一个点 '.' ，后面再跟着至少一位数字 
// 一个点 '.' ，后面跟着至少一位数字 
// 
// 
// 
//
// 整数（按顺序）可以分成以下几个部分： 
//
// 
// （可选）一个符号字符（'+' 或 '-'） 
// 至少一位数字 
// 
//
// 部分数值列举如下： 
//
// 
// ["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"] 
// 
//
// 部分非数值列举如下： 
//
// 
// ["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"] 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：s = "0"
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：s = "e"
//输出：false
// 
//
// 示例 3： 
//
// 
//输入：s = "."
//输出：false 
//
// 示例 4： 
//
// 
//输入：s = "    .1  "
//输出：true
// 
//
// 
//
// 提示： 
//
// 
// 1 <= s.length <= 20 
// s 仅含英文字母（大写和小写），数字（0-9），加号 '+' ，减号 '-' ，空格 ' ' 或者点 '.' 。 
// 
// Related Topics 字符串 👍 283 👎 0

package com.cute.leetcode.editor.cn;
public class BiaoShiShuZhiDeZiFuChuanLcof {
    public static void main(String[] args) {
        new BiaoShiShuZhiDeZiFuChuanLcof().new Solution().isNumber("-1E-16");
    }
    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        /**
         * 保存前一个是num，或者已经出现了. 和 e
         * 最后返回是否以数字结尾
         * 这一题出的真是没什么意思，但是还得记住
         * 这个判断顺序最好是：数字 ——> . ——> e/E ——> +-
         */
        public boolean isNumber(String s) {
            char[] chars = s.trim().toCharArray();
            boolean numSeen = false;
            boolean dotSeen = false;
            boolean eSeen = false;
            for (int i = 0; i < chars.length; i++) {
                if (isNum(chars[i])) numSeen = true;
                else if (chars[i] == '.'){
                    //.前边不能有.或者e，前边有没有数无所谓
                    if (dotSeen || eSeen) return false;
                    dotSeen = true;
                }else if (chars[i] == 'e' || chars[i] == 'E'){
                    if (eSeen || !numSeen) return false;//E之前必须是数字
                    eSeen = true;
                    numSeen = false;//这里一定要将numSeen重置，因为e之后必须还要出现数字
                }else if (chars[i] == '+' || chars[i] == '-'){
                    // +-号只能出现在开头或者e/E之后，而且前边e的判断已经避免了两次e出现的情况
                    if (i != 0 && chars[i - 1] != 'e' && chars[i - 1] != 'E') return false;
                }else return false;// 非法输入直接返回false
            }
            return numSeen;//必须是数字结尾才行
        }
        private boolean isNum(char c){
            return c >= '0' && c <= '9';
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}